home *** CD-ROM | disk | FTP | other *** search
/ PC Direct 1998 August / PC Direct August 1998.iso / S / powerj / Product / hpp.z / STRING.HPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-01-30  |  10.7 KB  |  283 lines

  1. //
  2. //  string.hpp  Strings
  3. //
  4. //  Copyright by WATCOM International Corp. 1988-1996.  All rights reserved.
  5. //
  6. #ifndef _STRING_HPP_INCLUDED
  7. #define _STRING_HPP_INCLUDED
  8. #if !defined(_ENABLE_AUTODEPEND)
  9.   #pragma read_only_file;
  10. #endif
  11.  
  12. #ifndef __cplusplus
  13. #error string.hpp is for use with C++
  14. #endif
  15.  
  16. #ifndef _COMDEF_H_INCLUDED
  17.  #include <_comdef.h>
  18. #endif
  19. #ifndef _CTYPE_H_INCLUDED
  20.  #include <ctype.h>
  21. #endif
  22. #ifndef _STDDEF_H_INCLUDED
  23.  #include <stddef.h>
  24. #endif
  25. #ifndef _IOSTREAM_H_INCLUDED
  26.  #include <iostream.h>
  27. #endif
  28.  
  29. const size_t NPOS = (size_t) -1;
  30.     
  31. // Define a typedef for a "C" function
  32. extern "C" {
  33.  typedef int (*__zapcase_t)( int );
  34. };
  35.  
  36. class _WPRTLINK String {
  37. public:
  38.  
  39.     typedef enum {
  40.         default_size,
  41.         reserve
  42.     } capacity;
  43.                                                 // constructors
  44.     String();                                   //   default
  45.     String( size_t, capacity );                 //   with specified size
  46.     String( String const &,                     //   from another String
  47.             size_t __pos = 0,
  48.             size_t __n = NPOS );
  49.     String( char const *, size_t __n = NPOS );  //   from C string
  50.     String( char, size_t __rep = 1 );           //   from single character
  51.  
  52.     ~String();                                  // destructor
  53.  
  54.                                                 // conversion operators
  55.     operator char const * ();                   //   to C string
  56.     operator char const * () const;             //   to C string
  57.     char const * c_str() const;                 //   to C string
  58.     operator char () const;                     //   to single character
  59.  
  60.                                                 // assignment operators
  61.     String & operator = ( String const & );     //   from another String
  62.     String & operator = ( char const * );       //   from a C string
  63.  
  64.                                                 // append operators
  65.     String & operator += ( String const & );    //   a String
  66.     String & operator += ( char const * );      //   a C string
  67.  
  68.     String operator () ( size_t __pos,          // substring operator
  69.                          size_t __len ) const;
  70.  
  71.     char & operator () ( size_t __pos );        // reference-to-char operator
  72.     char const & operator ()
  73.                        ( size_t __pos ) const;  // reference-to-char operator
  74.     char & operator [] ( size_t __pos );        // subscript operator
  75.     char const & operator []
  76.                        ( size_t __pos ) const;  // subscript operator
  77.  
  78.                                                 // comparison operators
  79.     friend _WPRTLINK int operator == ( 
  80.             String const &, String const & );   //   String == String?
  81.     friend _WPRTLINK int operator == ( 
  82.             String const &, char const * );     //   String == C string?
  83.     friend _WPRTLINK int operator == ( 
  84.             char const *, String const & );     //   C string == String?
  85.     friend _WPRTLINK int operator == ( 
  86.             String const &, char );             //   String == character?
  87.     friend _WPRTLINK int operator == ( 
  88.             char, String const & );             //   character == String?
  89.  
  90.     friend _WPRTLINK int operator != ( 
  91.             String const &, String const & );   //   String != String?
  92.     friend _WPRTLINK int operator != ( 
  93.             String const &, char const * );     //   String != C string?
  94.     friend _WPRTLINK int operator != ( 
  95.             char const *, String const & );     //   C string != String?
  96.     friend _WPRTLINK int operator != ( 
  97.             String const &, char );             //   String != character?
  98.     friend _WPRTLINK int operator != ( 
  99.             char, String const & );             //   character != String?
  100.  
  101.     friend _WPRTLINK int operator < ( 
  102.             String const &, String const & );   //   String < String?
  103.     friend _WPRTLINK int operator < ( 
  104.             String const &, char const * );     //   String < C string?
  105.     friend _WPRTLINK int operator < ( 
  106.             char const *, String const & );     //   C string < String?
  107.     friend _WPRTLINK int operator < ( 
  108.             String const &, char );             //   String < character?
  109.     friend _WPRTLINK int operator < ( 
  110.             char, String const & );             //   character < String?
  111.  
  112.     friend _WPRTLINK int operator <= ( 
  113.             String const &, String const & );   //   String <= String?
  114.     friend _WPRTLINK int operator <= ( 
  115.             String const &, char const * );     //   String <= C string?
  116.     friend _WPRTLINK int operator <= ( 
  117.             char const *, String const & );     //   C string <= String?
  118.     friend _WPRTLINK int operator <= ( 
  119.             String const &, char );             //   String <= character?
  120.     friend _WPRTLINK int operator <= ( 
  121.             char, String const & );             //   character <= String?
  122.  
  123.     friend _WPRTLINK int operator > ( 
  124.             String const &, String const & );   //   String > String?
  125.     friend _WPRTLINK int operator > ( 
  126.             String const &, char const * );     //   String > C string?
  127.     friend _WPRTLINK int operator > ( 
  128.             char const *, String const & );     //   C string > String?
  129.     friend _WPRTLINK int operator > ( 
  130.             String const &, char );             //   String > character?
  131.     friend _WPRTLINK int operator > ( 
  132.             char, String const & );             //   character > String?
  133.  
  134.     friend _WPRTLINK int operator >= ( 
  135.             String const &, String const & );   //   String >= String?
  136.     friend _WPRTLINK int operator >= ( 
  137.             String const &, char const * );     //   String >= C string?
  138.     friend _WPRTLINK int operator >= ( 
  139.             char const *, String const & );     //   C string >= String?
  140.     friend _WPRTLINK int operator >= ( 
  141.             String const &, char );             //   String >= character?
  142.     friend _WPRTLINK int operator >= ( 
  143.             char, String const & );             //   character >= String?
  144.  
  145.                                                 // concatenate string operators
  146.     friend _WPRTLINK String operator + ( 
  147.             String const &, String const & );   //   String + String
  148.     friend _WPRTLINK String operator + ( 
  149.             String const &, char const * );     //   String + C string
  150.     friend String operator + ( 
  151.             String const &, char * );           //   String + C string
  152.     friend _WPRTLINK String operator + ( 
  153.             char const *, String const & );     //   C string + String
  154.     friend String operator + ( 
  155.             char *, String const & );           //   C string + String
  156.     friend _WPRTLINK String operator + ( 
  157.             String const &, char );             //   String + character
  158.     friend _WPRTLINK String operator + ( 
  159.             char, String const & );             //   character + String
  160.  
  161.                                                 // input/output operators
  162.     friend _WPRTLINK istream & operator >> ( 
  163.             istream &, String & );              // input
  164.     friend _WPRTLINK ostream & operator << ( 
  165.             ostream &, String const & );        // output
  166.  
  167. // Member functions:
  168.     size_t length() const;                  // length of String
  169.  
  170.     char const & get_at( size_t ) const;    // get the n'th character
  171.     void put_at( size_t, char );            // replace the n'th character
  172.  
  173.                                             // find differing character loc
  174.     int match( String const & ) const;      //   search string is a String
  175.     int match( char const *   ) const;      //   search string is a C string
  176.  
  177.                                             // find substring location
  178.     int index( String const &,              //   search string is a String
  179.                size_t __pos = 0 ) const;
  180.     int index( char const *,                //   search string is a C string
  181.                size_t __pos = 0 ) const;
  182.  
  183.                                             // letter case conversion
  184.     String upper() const;                   //   to upper case
  185.     String lower() const;                   //   to lower case
  186.  
  187.     int operator ! () const;                // invalid String?
  188.     int valid() const;                      // valid String?
  189.     friend _WPRTLINK int valid( 
  190.             String const & );               // valid String?
  191.  
  192.     int alloc_mult_size() const;            // get string_mult_size
  193.     int alloc_mult_size( int __mult );      // get/set string_mult_size
  194.  
  195. private:
  196.  
  197.     class StringRep {
  198.     public:
  199.         size_t  __refcount;
  200.         size_t  __avail_length;
  201.         size_t  __used_length;
  202.         char    __value[1];           // variable length
  203.     };
  204.  
  205.     StringRep   *__srep;
  206.     size_t      __offset;
  207.     size_t      __slength;
  208.     char        *__c_string;
  209.  
  210.     // Memory for StringRep's is allocated in multiples of string_mult_size
  211.     static size_t __string_mult_size;
  212.     static char   __ref_char;
  213.  
  214.     static StringRep *__AllocStringRep( StringRep *, size_t );
  215.     static int        __CompareStrings( String const &, String const & );
  216.     void   __AppendToStringRep( String const &, char const *, size_t );
  217.     void   __FreeStringRep();
  218.     void   __JoinStrings( char const *, size_t, char const *, size_t );
  219.     String __ZapCase( __zapcase_t ) const;
  220. };
  221.  
  222. inline char const * String::c_str() const {
  223.     return( this->operator const char *() );
  224. }
  225.  
  226. inline char &String::operator [] ( size_t __pos ) {
  227.     return( this->operator()( __pos ) );
  228. }
  229.  
  230. inline char const &String::operator [] ( size_t __pos ) const {
  231.     return( this->operator()( __pos ) );
  232. }
  233.  
  234. inline char const &String::get_at( size_t __pos ) const {
  235.     return( this->operator()( __pos ) );
  236. }
  237.  
  238. inline void String::put_at( size_t __pos, char __c ) {
  239.     if( __pos < __slength ) {
  240.         this->operator()( __pos ) = __c;
  241.     } else if( __pos == __slength ) {
  242.         *this += String( __c );
  243.     }
  244. }
  245.  
  246. inline String String::upper() const {
  247.     return( __ZapCase( &::toupper ) );
  248. }
  249.  
  250. inline String String::lower() const {
  251.     return( __ZapCase( &::tolower ) );
  252. }
  253.  
  254. inline int String::operator ! () const {
  255.     return( __srep == NULL );
  256. }
  257.  
  258. inline int String::valid() const {
  259.     return( __srep != NULL );
  260. }
  261.  
  262. inline int valid( String const &__s ) {
  263.     return( __s.__srep != NULL );
  264. }
  265.  
  266. inline size_t String::length() const {
  267.     return( __slength );
  268. }
  269.  
  270. inline int String::alloc_mult_size() const {
  271.     return( String::__string_mult_size );
  272. }
  273.     
  274. inline String operator + ( String const &__s, char *__p ) {
  275.     return( operator + ( __s, (char const *)__p ) );
  276. }
  277.     
  278. inline String operator + ( char *__p, String const &__s ) {
  279.     return( operator + ( (char const *)__p, __s ) );
  280. }
  281.  
  282. #endif
  283.